"""
【Socket】
"""
import socket

"""
【服务端】

    socket 简称套接字，是进程之间通讯的一个工具。
    
    socket负责进程之间的网络数据传输。
    
    socket服务端：等待其它进程的连接，可接受发来的信息，可以回复消息。
    socket客户端：主动连接服务端，可以发送消息，可以接收消息。
"""

# 创建socket对象
socket_server = socket.socket()
# 绑定ip地址和端口
socket_server.bind(('localhost', 8888))
# 监听端口
socket_server.listen(2)  # listen方法内的参数，表示允许连接的数量
# 等待客户端连接
# result: tuple = socket_server.accept()
# conn: tuple = result[0]  # 客户端和服务端的连接对象
# addr: tuple = result[1]  # 客户端的地址信息
conn, addr = socket_server.accept()  # accept()方法是一个阻塞的方法（即这个方法只要没执行，程序就会停在这里）

print(f"接收到了客户端的连接，客户端的信息是：{addr}")
while True:
    # 接收客户端信息
    data: str = conn.recv(1024).decode("UTF-8")
    """
    recv方法接收的参数是缓冲区的大小，一般给1024
    recv方法的返回值是一个字节数组，也就是bytes对象，不是字符串，可以通过decode方法将字节数组转换成字符串对象。
    """
    print(f"客户端发来的消息是：{data}")
    # 发送回复消息
    msg = input("请输入你要给客户端回复的消息：")
    if msg == "exit":
        break
    conn.send(msg.encode("UTF-8"))  # encode方法将字符串转换成字节码对象
# 关闭连接
conn.close()
socket_server.close()
